/*--- bubble.c ---------------------------- Listing 5-4 ---------
 * Bubble sort an array
 *
 * #define DRIVER to compile a test driver
 * Driver must be linked to sortsub.c (Listing 5-1).
 *-------------------------------------------------------------*/

#include "sorthdr.h"

#define DRIVER 1

void BubbleSort(Element **Array, int N, CompFunc Compare)
{
    int limit;

    /* Make steadily shorter passes ... */
    for (limit = N - 1; limit > 0; limit--) {
        int j, swapped;

        /* On each pass, sweep largest element to end of array */
        swapped = 0;
        for (j = 0; j < limit; j++) {
            if (Compare(Array[j], Array[j + 1]) > 0) {
                Element *temp;

                temp = Array[j];
                Array[j] = Array[j + 1];
                Array[j + 1] = temp;
                swapped = 1;
            }
        }

        if (!swapped)
            break; /* if no swaps, we have finished */
    }
}

#ifdef DRIVER
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "sortsub.h"

/*
 * A comparison function
 */
int Cfunc(Element *L, Element *R)
{
    return (strncmp(L->text, R->text, 5));
}

void main(int argc, char *argv[])
{
    Element **Array;
    int Items = 2000;

    if (argc != 2 && argc != 3) {
        fprintf(stderr, "Usage: bubble infile [maxitems]\n");
        return;
    }

    if (argc == 3)
        Items = atoi(argv[2]);

    if ((Items = LoadArray(argv[1], Items, &Array)) == -1)
        return; 	/* Couldn't load file */

    BubbleSort(Array, Items, (CompFunc)Cfunc);
    ShowArray(Array, Items, (CompFunc)Cfunc);
}
#endif
